package gruppenkalenderProjekt.kalenderinterface;

import gruppenkalenderProjekt.Verwaltung;
import gruppenkalenderProjekt.data.Benutzer;
import gruppenkalenderProjekt.data.Kalender;
import gruppenkalenderProjekt.data.Kalendereintrag;
import gruppenkalenderProjekt.data.Kategorie;
import java.awt.Color;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.sql.Time;
import java.util.Date;
import java.util.Vector;
import javax.swing.JOptionPane;

/**
 *
 * @author Christian Rathke und Gruppe 2
 */
public class InterfaceClient {

    Verwaltung verwaltung = null;
    String IP = null;

    /**
     * Initiieren der Verbindung zum Remote-Object "Verwaltung" durch Nachschauen
     * in der RMI-Registry des RMI-Registry-Hosts.
     */
    public InterfaceClient(String ip) {
        this.IP = ip;
    }

    private void initServerConnection() {
        String rmiRegistryServer = System.getProperty("java.rmi.registry.hostname", IP);
        try {
            // Verbindung zur Verwaltung wird hergestellt.
            verwaltung = (Verwaltung) Naming.lookup("rmi://" + IP + ":1099/Verwaltung");     //Beim Bankprojekt war die 1 dahinter. Bin mir hier nicht ganz sicher - Stefan
            System.out.println("Verbindung erfolgreich hergestellt mit IP " + IP);
        } catch (MalformedURLException murle) {
            System.out.println("MalformedURLException");
            System.out.println(murle);
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        } catch (NotBoundException e) {
            System.out.println("NotBoundException");
            System.out.println(e);
        }
    }

    public Benutzer createBenutzer(String benutzername, String vorname,
            String nachname, String raum, String email, String telefon, boolean superbenutzer) {
        Benutzer b = null;

        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        // Es wird die entsprechende Methode in der Verwaltung aufgerufen um einen Benutzer anzulegen.
        try {
            b = verwaltung.createBenutzer(benutzername, vorname, nachname, raum, email, telefon, superbenutzer);

            // Die Attribute des übergebenen Benutzers (benutzer) wurden in das leere Benutzerobjekt (b) eingefügt. Nachdem der Benutzer
            // erfolgreich angelegt ist, öffnet sich ein Popupfenster und fasst die Eingaben zusammen
            if (b != null) {
                //Überprüfung auf Superbenutzer
                String superbenutzerTemp = null;
                if (b.isSuperbenutzer() == false) {
                    superbenutzerTemp = "Nein";
                } else {
                    superbenutzerTemp = "Ja";
                }
                String message = (String) (("Neuer Benutzer erfolgreich angelegt: \n" + "Benutzername: " + b.getBenutzername() + "\n" +
                        "Vorname: " + b.getVorname() + "\n" +
                        "Nachname: " + b.getNachname() + "\n" +
                        "Raum: " + b.getRaum() + "\n" +
                        "E-Mail: " + b.getEmail() + "\n" +
                        "Telefon: " + b.getTelefon() + "\n" +
                        "Superbenutzer: " + superbenutzerTemp));
                JOptionPane.showMessageDialog(null, message, "Benutzer angelegt", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
            } else {
                JOptionPane.showMessageDialog(null, "Es wurde kein Benutzer angelegt!", "Benutzer nicht angelegt", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
            }
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);

        }
        return b;
    }

    public Benutzer updateBenutzer(Benutzer benutzer) {
        Benutzer b = null;

        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu editieren
            b = verwaltung.updateBenutzer(benutzer);
            JOptionPane.showMessageDialog(null, "Benutzer erfolgreich editiert", "Benutzer editiert", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return b;
    }

    public void deleteBenutzer(Benutzer benutzer) {
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu löschen
            verwaltung.deleteBenutzer(benutzer);
            JOptionPane.showMessageDialog(null, "Benutzer erfolgreich gelöscht", "Benutzer gelöscht", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
    }

    public Vector<Benutzer> getAlleBenutzer() {
        if (verwaltung == null) {
            initServerConnection();
        }
        Vector<Benutzer> v = new Vector<Benutzer>();
        try {
            v = verwaltung.getAlleBenutzer();
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return v;
    }

    public Benutzer getBenutzerMitID(int b_ID) {
        Benutzer b = null;

        if (verwaltung == null) {
            initServerConnection();
        }
        //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu suchen
        try {
            b = verwaltung.getBenutzerMitID(b_ID);

        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return b;
    }

    public Benutzer getBenutzerMitBenutzername(String benutzername) {
        Benutzer b = null;

        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu editieren
            b = verwaltung.getBenutzerMitBenutzername(benutzername);

        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return b;
    }

    public Kategorie createKategorie(String bezeichnung, Color farbe) {
        Kategorie k = null;
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        // Es wird die entsprechende Methode in der Verwaltung aufgerufen um einen Benutzer anzulegen.
        try {
            k = verwaltung.createKategorie(bezeichnung, farbe);

            // Die Attribute der übergebenen Kategorie wurden in das leere Kategorieobjekt (k) eingefügt. Nachdem die Kategorie
            // erfolgreich angelegt ist, öffnet sich ein Popupfenster und fasst die Eingaben zusammen
            if (k != null) {
                String message = (String) (("Neue Kategorie erfolgreich angelegt: \n" + "Kategoriebezeichnung: " + k.getBezeichnung() + "\n"));
                JOptionPane.showMessageDialog(null, message, "Kategorie angelegt", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
            } else {
                JOptionPane.showMessageDialog(null, "Es wurde keine Kategorie angelegt!", "Kategorie nicht angelegt", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
            }
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);

        }
        return k;
    }

    public Kategorie updateKategorie(Kategorie kategorie) {
        Kategorie k = null;

        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu editieren
            k = verwaltung.updateKategorie(kategorie);
            JOptionPane.showMessageDialog(null, "Kategorie erfolgreich editiert", "Kategorie editiert", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return k;
    }

    public void deleteKategorie(Kategorie kategorie) {
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu löschen
            verwaltung.deleteKategorie(kategorie);
            JOptionPane.showMessageDialog(null, "Kategorie erfolgreich gelöscht", "Kategorie gelöscht", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);

        }
    }

    public Vector<Kategorie> getAlleKategorien() {
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        Vector<Kategorie> v = new Vector<Kategorie>();
        try {
            v = verwaltung.getAlleKategorien();
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return v;
    }

    public Kategorie getKategorieMitID(int kat_ID) {
        Kategorie k = null;
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu suchen
        try {
            k = verwaltung.getKategorieMitID(kat_ID);

        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return k;
    }

    public Kalender createKalender(String name, Vector<Kalendereintrag> kalendereintraege,
            Vector<Benutzer> benutzer, Benutzer besitzer) {
        Kalender ka = null;
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        // Es wird die entsprechende Methode in der Verwaltung aufgerufen um einen Benutzer anzulegen.
        try {
            ka = verwaltung.createKalender(name, kalendereintraege, benutzer, besitzer);

            // Die Attribute des übergebenen Kalenders wurden in das leere Kategorieobjekt (ka) eingefügt. Nachdem der Kalender
            // erfolgreich angelegt ist, öffnet sich ein Popupfenster und fasst die Eingaben zusammen
            if (ka != null) {
                StringBuffer benutzerDesKalenders = new StringBuffer();
                for (int i = 0; i < benutzer.size(); i++) {
                    benutzerDesKalenders.append(benutzer.elementAt(i).getBenutzername() + " \n");
                }
                String message = (String) (("Neuer Kalender erfolgreich angelegt: \n \n" + "Kalendername: " + ka.getName() + "\n" + // Vektor kommt zurück. for-schleife oder reicht toString?
                        "Ersteller: " + ka.getBesitzer().getBenutzername() + "\n" +
                        "Benutzer: " + "\n" + benutzerDesKalenders));
                JOptionPane.showMessageDialog(null, message, "Kalender angelegt", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
            } else {
                JOptionPane.showMessageDialog(null, "Es wurde kein Kalender angelegt!", "Kalender nicht angelegt", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
            }
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);

        }
        return ka;
    }

    public Kalender updateKalender(Kalender kalender) {
        Kalender ka = null;

        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu editieren
            ka = verwaltung.updateKalender(kalender);
            JOptionPane.showMessageDialog(null, "Kalender erfolgreich editiert", "Kalender editiert", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return ka;
    }

    public void deleteKalender(Kalender kalender) {
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu löschen
            verwaltung.deleteKalender(kalender);
            JOptionPane.showMessageDialog(null, "Kalender erfolgreich gelöscht", "Kalender gelöscht", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);

        }
    }

    public Kalender getKalenderMitID(int k_ID) {
        Kalender ka = null;
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu suchen
        try {
            ka = verwaltung.getKalenderMitID(k_ID);

        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return ka;
    }

    public Vector<Kalender> getAlleKalender() {
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        Vector<Kalender> v = new Vector<Kalender>();
        try {
            v = verwaltung.getAlleKalender();
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return v;
    }

    public Kalendereintrag createKalendereintrag(String titel, Kategorie kategorie, Benutzer ersteller,
            String beschreibung, String ort, Date startdatum, Time startzeit, Date enddatum,
            Time endzeit, boolean erinnerung, int zeitdifferenz, boolean alarm, Vector<Benutzer> teilnehmer,
            Kalendereintrag folgetermin, int kalender_ID, int wiederholung) {
        Kalendereintrag ke = null;

        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        // Es wird die entsprechende Methode in der Verwaltung aufgerufen um einen Benutzer anzulegen.
        try {
            ke = verwaltung.createKalendereintrag(titel, kategorie, ersteller,
                    beschreibung, ort, (java.sql.Date) startdatum, startzeit, (java.sql.Date) enddatum,
                    endzeit, erinnerung, zeitdifferenz, alarm, teilnehmer,
                    folgetermin, kalender_ID, wiederholung);

            // Die Attribute wurden in das leere Eintragsobjekt (ke) eingefügt. Nachdem der Kalendereintrag
            // erfolgreich angelegt ist, öffnet sich ein Popupfenster und fasst die Eingaben zusammen
            if (ke != null) {
                //Überprüfung auf Erinnerung
                String erinnerungTemp = null;
                if (ke.isErinnerung() == false) {
                    erinnerungTemp = "Nein";
                } else {
                    erinnerungTemp = "Ja";
                }
                //Überprüfung auf Alarm
                String alarmTemp = null;
                if (ke.isAlarm() == false) {
                    alarmTemp = "Nein";
                } else {
                    alarmTemp = "Ja";
                }
                String tempWiederholung = "Nein";
                if(wiederholung == 1)tempWiederholung = "Wöchentlich";
                if(wiederholung == 2)tempWiederholung = "Monatlich";
                if(wiederholung == 3)tempWiederholung = "Jährlich";

                String message = (String) (("Neuer Kalendereintrag erfolgreich angelegt: \n" + "Titel: " + ke.getTitel() + "\n" +
                        "Kategorie: " + ke.getKategorie().getBezeichnung() + "\n" +
                        "Ort: " + ke.getOrt() + "\n" +
                        "Start: " + ke.getStartdatum() + " " + ke.getStartzeit() + "\n" +
                        "Ende: " + ke.getEnddatum() + " " + ke.getEndzeit() + "\n" +
                        "Erinnerung: " + erinnerungTemp + ", " + ke.getZeitdifferenzErinnerung() + " Minuten vorher erinnern \n" +
                        "Wiederholung: " + tempWiederholung + "\n" +
                        "Alarm: " + alarmTemp + "\n" +
                        "in Kalender: " + ke.getKalenderID()));
                JOptionPane.showMessageDialog(null, message, "Kalendereintrag angelegt", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
            } else {
                JOptionPane.showMessageDialog(null, "Es wurde kein Kalendereintrag angelegt!", "Kalendereintrag nicht angelegt", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
            }
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);

        }
        return ke;
    }

    public Kalendereintrag updateKalendereintrag(Kalendereintrag kalendereintrag) {
        Kalendereintrag ke = null;

        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu editieren
            ke = verwaltung.updateKalendereintrag(kalendereintrag);
            JOptionPane.showMessageDialog(null, "Kalendereintrag erfolgreich editiert", "Kalendereintrag editiert", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return ke;
    }

    public void deleteKalendereintrag(Kalendereintrag kalendereintrag) {
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu löschen
            verwaltung.deleteKalendereintrag(kalendereintrag);
            JOptionPane.showMessageDialog(null, "Kalendereintrag erfolgreich gelöscht", "Kalendereintrag gelöscht", 2, null);         // null muss noch mit dem richtigen frame ersetzt werden !!!!!!!
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
    }

    public Vector<Kalendereintrag> getAlleKalendereintraege() {
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        Vector<Kalendereintrag> v = new Vector<Kalendereintrag>();
        try {
            v = verwaltung.getAlleKalendereintraege();
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return v;
    }

    public Kalendereintrag getKalendereintragMitID(int e_ID) {
        Kalendereintrag ke = null;
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        //Die Verwaltung wird direkt angewiesen das übergebene Objekt zu suchen
        try {
            ke = verwaltung.getKalendereintragMitID(e_ID);

        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return ke;
    }

    public Vector<Kalendereintrag> getKalendereintraegeVonKalender(int k_ID) {
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        Vector<Kalendereintrag> v = new Vector<Kalendereintrag>();
        try {
            v = verwaltung.getKalendereintraegeVonKalender(k_ID);
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return v;
    }

    public Vector<Kalendereintrag> getAlleKalendereintraegeVonBenutzer(int b_ID) {
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        Vector<Kalendereintrag> v = new Vector<Kalendereintrag>();
        try {
            v = verwaltung.getAlleKalendereintraegeVonBenutzer(b_ID);
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return v;
    }

    public Vector<Kalender> getAlleKalenderVonSuperbenutzer(int b_id) {
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        Vector<Kalender> v = new Vector<Kalender>();
        try {
            v = verwaltung.getAlleKalenderVonSuperbenutzer(b_id);
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return v;
    }

    public Vector<Kalender> getAlleKalenderVonBenutzer(int b_id) {
        //Falls keine Serververbindung besteht, initiiere diese
        if (verwaltung == null) {
            initServerConnection();
        }
        Vector<Kalender> v = new Vector<Kalender>();
        try {
            v = verwaltung.getAlleKalenderVonBenutzer(b_id);
        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return v;
    }

    public Vector<Benutzer> getBenutzerVonKalender(int k_ID) throws RemoteException {
        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            return verwaltung.getBenutzerVonKalender(k_ID);

        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return null;


    }

    public boolean isKalendereintragStartzeitZulaessig(Kalendereintrag k) throws RemoteException {
        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            return verwaltung.isKalendereintragStartzeitZulaessig(k);

        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return true;
    }

    public boolean existiertBenutzerMitBenutzername(String benutzername, Benutzer aktuellerBenutzer) throws RemoteException {

        if (verwaltung == null) {
            initServerConnection();
        }
        try {
            return verwaltung.existiertBenutzerMitBenutzername(benutzername, aktuellerBenutzer);

        } catch (RemoteException re) {
            System.out.println("RemoteException");
            System.out.println(re);
        }
        return false;
    }
}
